﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LojaVirtual.Comuns.Produtos;
using System.Data.Entity;
using LojaVirtual.Comuns.Clientes;

namespace LojaVirtual.Infra
{
    public class UnitOfWork : IDisposable
    {
        private bool disposed;
        private readonly LojaVirtualContext contexto;

        private GenericRepository<Categoria> _categorias;
        private GenericRepository<Produto> _produtos;
		private GenericRepository<Cliente> _clientes;
		private CompraRepository _compra;

        public UnitOfWork()
        {
            contexto = new LojaVirtualContext();
        }

        public UnitOfWork(LojaVirtualContext contexto)
        {
            this.contexto = contexto;
        }

        public GenericRepository<Categoria> Categorias
        {
            get
            {
				DbSet<Categoria> db = contexto.Set<Categoria>();
				return _categorias ?? (_categorias = new GenericRepository<Categoria>(contexto, db));
            }
        }

		public GenericRepository<Produto> Produtos
		{
			get
			{
				DbSet<Produto> db = contexto.Set<Produto>();
				if(_produtos == null)
					_produtos = new GenericRepository<Produto>(contexto, db);

				return _produtos;
			}
		}


		public GenericRepository<Cliente> Clientes
		{
			get
			{
				DbSet<Cliente> db = contexto.Set<Cliente>();
				if(_clientes == null)
					_clientes = new GenericRepository<Cliente>(contexto, db);

				return _clientes;
			}
		}

		public CompraRepository Compras
		{
			get
			{
				DbSet<Compra> db = contexto.Set<Compra>();

				if (this._compra == null)
					_compra = new CompraRepository(contexto, db);

				return _compra;
			}
		}

        public void SalvarAlteracoes()
        {
            contexto.SaveChanges();
        }

        private void Dispose(bool disposing)
        {
            if (disposed)
            {
                if (disposing)
                {
                    contexto.Dispose();
                }
            }
            disposed = true;
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}
